package com.smart.community.commons.base;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.List;

/**
 * 基础Mapper接口
 * 继承MyBatis-Plus的BaseMapper接口，并扩展通用查询方法
 * 所有业务Mapper接口都应该继承此接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2024-12-19
 * @param <T> 实体类型
 */
public interface IBaseMapper<T extends BaseEntity> extends BaseMapper<T> {

    /**
     * 查询所有未删除的实体
     * 
     * @return 实体列表
     */
    List<T> selectAllActive();

    /**
     * 根据查询条件查询实体列表
     * 
     * @param query 查询条件
     * @return 实体列表
     */
    List<T> selectByQuery(@Param("query") BaseQuery query);

    /**
     * 根据查询条件查询单个实体
     * 
     * @param query 查询条件
     * @return 实体对象
     */
    T selectOneByQuery(@Param("query") BaseQuery query);

    /**
     * 分页查询实体
     * 
     * @param page 分页参数
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<T> selectPageByQuery(Page<T> page, @Param("query") BaseQuery query);

    /**
     * 根据字段值查询单个实体
     * 
     * @param column 字段名
     * @param value 字段值
     * @return 实体对象
     */
    T selectOneByColumn(@Param("column") String column, @Param("value") Object value);

    /**
     * 根据字段值查询实体列表
     * 
     * @param column 字段名
     * @param value 字段值
     * @return 实体列表
     */
    List<T> selectByColumn(@Param("column") String column, @Param("value") Object value);

    /**
     * 根据创建时间范围查询实体
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 实体列表
     */
    List<T> selectByCreateTimeRange(@Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * 根据更新时间范围查询实体
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 实体列表
     */
    List<T> selectByUpdateTimeRange(@Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * 统计所有未删除的实体数量
     * 
     * @return 总数量
     */
    Long countAllActive();

    /**
     * 根据查询条件统计数量
     * 
     * @param query 查询条件
     * @return 数量
     */
    Long countByQuery(@Param("query") BaseQuery query);

    /**
     * 根据字段值统计数量
     * 
     * @param column 字段名
     * @param value 字段值
     * @return 数量
     */
    Long countByColumn(@Param("column") String column, @Param("value") Object value);

    /**
     * 根据字段值判断是否存在
     * 
     * @param column 字段名
     * @param value 字段值
     * @return 是否存在
     */
    Boolean existsByColumn(@Param("column") String column, @Param("value") Object value);

    /**
     * 根据条件物理删除
     * 
     * @param query 删除条件
     * @return 删除数量
     */
    int deleteByQuery(@Param("query") BaseQuery query);

    /**
     * 根据字段值物理删除
     * 
     * @param column 字段名
     * @param value 字段值
     * @return 删除数量
     */
    int deleteByColumn(@Param("column") String column, @Param("value") Object value);

    /**
     * 批量物理删除（真删除）
     * 
     * @param ids 主键ID集合
     * @return 删除数量
     */
    int deleteByIds(@Param("ids") List<? extends Serializable> ids);
} 